Objekty
Otázka od: Jiri Lev
3. 9. 2002 10:11
Zdravim, mam dotaz dala by se tahle vecicka nejak zlepsit, jde mi o to,
ze pokazdy kdyz pridam nejakou novou tridu, tak ji do toho musim dopsat,
aby to fungovalo jak ma.
Nedalo by se to nejak "zuniverzalnit" ???
For i:=0 to Form1.ComponentCount-1 Do Begin
obj := Form1.Components[i];
If (obj is TLabel) Then (obj as TLabel).Caption := 'x';
If (obj is TButton) Then (obj as TButton).Caption := 'y';
........
End;
Predem dik za vsechny postrehy
J
Odpovedá: ing. Jan Fiala
3. 9. 2002 12:13
Jde to castecne vyresit, pokud pouzijes spolecneho predka, ktery je v
hierarchii nejvys a pritom ma jeste potrebne vlastnosti.
V tomto pripade je to TControl.
Takze by to mohlo vypadat takto:
For i:=0 to Form1.ComponentCount-1 Do Begin
obj := Form1.Components[i];
If obj is TControl Then TControl(obj).Caption := 'x';
........
End;
Stale se nevyhnes deleni, ale zmensis pocet techto deleni.
--
ing. Jan Fiala
mailto:jan.fiala@iol.cz
3.9.2002 Jiri Lev:
> Zdravim, mam dotaz dala by se tahle vecicka nejak zlepsit, jde mi o to,
> ze pokazdy kdyz pridam nejakou novou tridu, tak ji do toho musim dopsat,
> aby to fungovalo jak ma.
> Nedalo by se to nejak "zuniverzalnit" ???
> For i:=0 to Form1.ComponentCount-1 Do Begin
> obj := Form1.Components[i];
> If (obj is TLabel) Then (obj as TLabel).Caption := 'x';
> If (obj is TButton) Then (obj as TButton).Caption := 'y';
> ........
> End;
> Predem dik za vsechny postrehy
> J
Odpovedá: Lauko Stefan
3. 9. 2002 14:05
Ahoj asi takto:
Uses TypInfo;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
Procedure SetCaption(O:TObject; S:String);
begin
try
SetStrProp(O, 'Caption',S);
Except
end;
end;
var
i:Integer;
begin
For i:=0 to Form1.ComponentCount-1 Do
Begin
SetCaption(Form1.Components[i],'Ahoj...');
End;
end;
end.
Lauko
----- Original Message -----
From: Jiri Lev
Nedalo by se to nejak "zuniverzalnit" ???
For i:=0 to Form1.ComponentCount-1 Do Begin
obj := Form1.Components[i];
If (obj is TLabel) Then (obj as TLabel).Caption := 'x';
If (obj is TButton) Then (obj as TButton).Caption := 'y';
........
End;
Odpovedá: Ludek Finstrle
3. 9. 2002 11:49
> Zdravim, mam dotaz dala by se tahle vecicka nejak zlepsit, jde mi o to,
> ze pokazdy kdyz pridam nejakou novou tridu, tak ji do toho musim dopsat,
> aby to fungovalo jak ma.
> Nedalo by se to nejak "zuniverzalnit" ???
>
> For i:=0 to Form1.ComponentCount-1 Do Begin
> obj := Form1.Components[i];
> If (obj is TLabel) Then (obj as TLabel).Caption := 'x';
> If (obj is TButton) Then (obj as TButton).Caption := 'y';
> ........
> End;
Zjistit, ktery predchudce uz ma Caption. Ted nesedim u Win stroje,
takze nevim presne, ale tusim nejaky TControl??
Luf
Odpovedá: martin.falta@obi.de
3. 9. 2002 19:09
podivej se do forms.pas na metodu TApplication.CreateForm. tam bys mohl
najit inspiraci.
Martin Falta
OBI IT
tel.: +420 2 96576 156
GSM: +420 603 151147
levj@jhv.cz
Sent by: To: delphi-l@clexpert.cz
delphi-l-owner@c cc:
lexpert.cz Subject: Objekty
03.09.2002 11:07
Please respond
to delphi-l
Zdravim, mam dotaz dala by se tahle vecicka nejak zlepsit, jde mi o to, ze
pokazdy kdyz pridam nejakou novou tridu, tak ji do toho musim dopsat, aby
to fungovalo jak ma.
Nedalo by se to nejak "zuniverzalnit" ???
For i:=0 to Form1.ComponentCount-1 Do Begin
obj := Form1.Components[i];
If (obj is TLabel) Then (obj as TLabel).Caption := 'x';
If (obj is TButton) Then (obj as TButton).Caption := 'y';
........
End;
Predem dik za vsechny postrehy
J
Odpovedá: Libor Junek, KSH-Data
3. 9. 2002 20:02
pouzij SetPropValue v TypInfo to nastavuje property podle nazvu.
Libor
From: delphi-l-owner@clexpert.cz [mailto:delphi-l-owner@clexpert.cz]On
Behalf Of Jiri Lev
> Zdravim, mam dotaz dala by se tahle vecicka nejak zlepsit, jde mi o to, ze
pokazdy kdyz pridam nejakou novou > tridu, tak ji do toho musim dopsat, aby
to fungovalo jak ma.
> Nedalo by se to nejak "zuniverzalnit" ???
>
> For i:=0 to Form1.ComponentCount-1 Do Begin
> obj := Form1.Components[i];
> If (obj is TLabel) Then (obj as TLabel).Caption := 'x';
> If (obj is TButton) Then (obj as TButton).Caption := 'y';
> ........
> End;
Odpovedá: Petr Vones
3. 9. 2002 13:30
From: "Jiri Lev" <levj@jhv.cz>
> Nedalo by se to nejak "zuniverzalnit" ???
>
> For i:=0 to Form1.ComponentCount-1 Do Begin
> obj := Form1.Components[i];
> If (obj is TLabel) Then (obj as TLabel).Caption := 'x';
> If (obj is TButton) Then (obj as TButton).Caption := 'y';
> ........
> End;
uses
TypInfo;
function SetControlCaption(Control: TControl; const Caption: string): Boolean;
var
PropInfo: PPropInfo;
begin
PropInfo := GetPropInfo(Control, 'Caption', [tkLString]);
Result := PropInfo <> nil;
if Result then
SetStrProp(Control, PropInfo, Caption);
end;
Petr Vones
Odpovedá: Jiri Lev
3. 9. 2002 13:49
Jo, jo, jo, jo.....
Dik, Dik I vsem ostatnim, zas sem o trosicku chytrejsi
-----Original Message-----
From: delphi-l-owner@clexpert.cz [mailto:delphi-l-owner@clexpert.cz] On
Behalf Of Petr Vones
Sent: Tuesday, September 03, 2002 2:30 PM
To: delphi-l@clexpert.cz
Subject: Re: Objekty
From: "Jiri Lev" <levj@jhv.cz>
> Nedalo by se to nejak "zuniverzalnit" ???
>
> For i:=0 to Form1.ComponentCount-1 Do Begin
> obj := Form1.Components[i];
> If (obj is TLabel) Then (obj as TLabel).Caption := 'x';
> If (obj is TButton) Then (obj as TButton).Caption := 'y';
> ........
> End;
uses
TypInfo;
function SetControlCaption(Control: TControl; const Caption: string):
Boolean; var
PropInfo: PPropInfo;
begin
PropInfo := GetPropInfo(Control, 'Caption', [tkLString]);
Result := PropInfo <> nil;
if Result then
SetStrProp(Control, PropInfo, Caption);
end;
Petr Vones
Odpovedá: Petr Vones
3. 9. 2002 18:52
From: "Lauko Stefan" <laukosw@naex.sk>
> Procedure SetCaption(O:TObject; S:String);
> begin
> try
> SetStrProp(O, 'Caption',S);
> Except
> end;
> end;
Toto je ukazkovy priklad zcela nevhodneho pouziti vyjimek. Vyjimka je neco
vyjimecneho, co by nemelo za beznych podminek vzniknout. V tomto pripade je
vsak pouzita jako nedilna soucast logiky te procedury. (nemluve o predavani
promenne typu string ktera by mela byt const S: string)
Zjednodusene misto:
Abc;
if I = 0 then
X := False
Xyz;
je tento kod ekvivalentni:
Abc;
try
if I = 0 then
raise Exception.Create(...
except
X := False;
end;
Xyz;
Pomineme-li ze vyjimky jsou pomerne casove narocne, je to z hlediska navrhu
krajne nevhodne reseni.
Petr Vones
Odpovedá: Petr Vones
3. 9. 2002 17:52
From: "Petr Vones" <pvones@mbox.vol.cz>
> je tento kod ekvivalentni:
... ve vyznamu, ekvivalentni nevhodnemu reseni v puvodnim prispevku.
Petr Vones
Odpovedá: Erik Salaj
5. 9. 2002 1:58
> No jo, jenze to je dnes modni a dokonce to ma svuj terminus technicus -
> ofenzivni programovaci styl . Nediv se, je to pohodlnejsi, mene
> narocne na hlavu a zejmena to zapada do komercniho modelu prodeje SW. Proc
> ztracet cas dukladnou analyzou a optimalizaci reseni, kdyz staci koupit
> vykonnejsi pocitac, ze...
problem moze byt v znalostiach programatorov, t.j. ci vedia
posudit vyhodnost/nevyhodnost pouzitia.
Erik
Odpovedá: Zbysek Hlinka
4. 9. 2002 8:58
On 3 Sep 2002 at 18:41, Petr Vones wrote:
> From: "Lauko Stefan" <laukosw@naex.sk>
> > Procedure SetCaption(O:TObject; S:String);
> > begin
> > try
> > SetStrProp(O, 'Caption',S);
> > Except
> > end;
> > end;
>
> Toto je ukazkovy priklad zcela nevhodneho pouziti vyjimek.
Ba prave naopak, toto pouziti je naprosto na miste. Trida totiz muze
obsahovat napriklad validaci vlastnosti, ktera probehne spravne kdyz
napises
Objekt.Caption := 'blabla';
ale skonci chybou, kdyz to naplnis pres SetXxxProp. Na tento problem
jsem narazil pri psani Lokalizatoru, konkretne u tridy
TMaskEdit.Text, kde SetStrProp skonci chybou, pokud se plni jindy nez
pri csLoading, protoze se spusti validace. Plnil jsem tam hodnotu,
ktera prisla z navrhu formulare. Pokud nemas jistotu, jake objekty se
ti tam nahrnou, je pouziti try except nezbytne.
S pozdravem
Zbysek Hlinka
E-mail: hlinka@hlinka.cz, localizator@localizator.com
Phone: +420 603 551 282
Odpovedá: Jiri Foldyna
4. 9. 2002 10:25
> Toto je ukazkovy priklad zcela nevhodneho pouziti vyjimek.
> Vyjimka je neco
> vyjimecneho, co by nemelo za beznych podminek vzniknout. V
> tomto pripade je
> vsak pouzita jako nedilna soucast logiky te procedury.
krajne nevhodne reseni.
>
> Petr Vones
>
No jo, jenze to je dnes modni a dokonce to ma svuj terminus technicus -
ofenzivni programovaci styl . Nediv se, je to pohodlnejsi, mene
narocne na hlavu a zejmena to zapada do komercniho modelu prodeje SW. Proc
ztracet cas dukladnou analyzou a optimalizaci reseni, kdyz staci koupit
vykonnejsi pocitac, ze...
Zdravim
Jiri Foldyna
mailto:jiri.f@avizo.cz
Odpovedá: Petr Vones
4. 9. 2002 14:09
From: "Jiri Foldyna" <jiri.f@avizo.cz>
> No jo, jenze to je dnes modni a dokonce to ma svuj terminus technicus -
> ofenzivni programovaci styl . Nediv se, je to pohodlnejsi, mene
> narocne na hlavu a zejmena to zapada do komercniho modelu prodeje SW. Proc
Mozna, ale pouzivat misto jedne konstrukce if ... then try..raise..except neni
prilis pohodlne a navic v tom puvodnim prikladu to melo jeste dalsi chybu a
to, ze se takto 'neosetrovala' pouze predpokladana vyjimka, ale vsechny dalsi
ktere mohly indikovat jinou dalsi (tentokrate skutecne nepredpokladanou)
chybu.
Timto 'modernim' stylem by jsme se vlastne mohli dostat i ke konstrukcim jako
(pripad kdy instance objektu nemusi existovat):
var
O: TSomeObject;
try
O.SomeMethod; // Access Violation pokud O = nil ...
except
end;
Misto:
var
O: TSomeObject;
if Assigned(O) then
O.SomeMethod;
Je to stale spravne reseni ?
Jinak receno, pouziva-li se nekde konstrukce try..except je nutne dobre zvazit
jeji oduvodnenost a mozne dusledky.
Petr Vones
Odpovedá: Petr Vones
4. 9. 2002 14:04
From: "Zbysek Hlinka" <hlinka@hlinka.cz>
> Ba prave naopak, toto pouziti je naprosto na miste. Trida totiz muze
> obsahovat napriklad validaci vlastnosti, ktera probehne spravne kdyz
> napises
>
> Objekt.Caption := 'blabla';
>
> ale skonci chybou, kdyz to naplnis pres SetXxxProp. Na tento problem
Jaky je prosimte mezi tim rozdil, oba pripady totiz skonci volanim
TControl.SetText.
> jsem narazil pri psani Lokalizatoru, konkretne u tridy
> TMaskEdit.Text, kde SetStrProp skonci chybou, pokud se plni jindy nez
> pri csLoading, protoze se spusti validace. Plnil jsem tam hodnotu,
Stejne by to bylo i pri primem volani Caption := '...'.
> ktera prisla z navrhu formulare. Pokud nemas jistotu, jake objekty se
> ti tam nahrnou, je pouziti try except nezbytne.
Pokud vznikne vyjimka (tedy situace neocekavana, chybna, branici pokracovat v
danem kodu) tak to neznamena ze to jen tak zahodis a delas, ze se nic nedeje.
V pripade TMaskEdit je to napriklad to, ze po validaci neodpovidala hodnota
zadane masce. To ale stale neni duvod pouzivat konstrukci try..except jako
if..then v situacich, kdy primo predpokladas (je soucasti logiky te funkce) ze
vzikne vyjimka a podle toho rozhodujes o vysledku funkce. Tak to prave bylo v
tom puvodnim prikladu.
Je to podobne jinemu typicky spatnemu prikladu na zjisteni zdali lze retezec
prevest na cislo:
try
I := StrToInt(S);
except
I := 0;
end;
Petr Vones
Odpovedá: Zbysek Hlinka
4. 9. 2002 14:54
On 4 Sep 2002 at 13:00, Petr Vones wrote:
> > jsem narazil pri psani Lokalizatoru, konkretne u tridy
> > TMaskEdit.Text, kde SetStrProp skonci chybou, pokud se plni jindy
> > nez pri csLoading, protoze se spusti validace. Plnil jsem tam
> > hodnotu,
>
> Stejne by to bylo i pri primem volani Caption := '...'.
Pokud ovsem pred tim nezavolas SetDesigning(true), nebo neco jineho,
co se nelibi validacni funkci.
> > ktera prisla z navrhu formulare. Pokud nemas jistotu, jake objekty
> > se ti tam nahrnou, je pouziti try except nezbytne.
>
> Pokud vznikne vyjimka (tedy situace neocekavana, chybna, branici
> pokracovat v danem kodu) tak to neznamena ze to jen tak zahodis a
> delas, ze se nic nedeje. V pripade TMaskEdit je to napriklad to, ze po
> validaci neodpovidala hodnota zadane masce. To ale stale neni duvod
> pouzivat konstrukci try..except jako if..then v situacich, kdy primo
> predpokladas (je soucasti logiky te funkce) ze vzikne vyjimka a podle
> toho rozhodujes o vysledku funkce. Tak to prave bylo v tom puvodnim
> prikladu.
U SetXxxProp to prave neovlivnis, protoze jednak nemusis vedet, co a
kam cpes (samozrejme, ze zalezi na typu ulohy, u Lokalizatoru to
nevim), jednak prave zde nelze testovat pres if, pokud neznas mnozinu
cilovych objektu, jednak kdyz ti to nekde rachne, je nutne problem
osetrit a pokracovat dal pro dalsi objekty a vlastnosti. Toto je
prave pripad, kdy muze dojit k neocekavane chybe, a casto neni jina
moznost, jak ji osetrit.
S pozdravem
Zbysek Hlinka
E-mail: hlinka@hlinka.cz, localizator@localizator.com
Phone: +420 603 551 282
Odpovedá: Lauko Stefan
4. 9. 2002 21:54
> From: "Lauko Stefan" <laukosw@naex.sk>
> > Procedure SetCaption(O:TObject; S:String);
> > begin
> > try
> > SetStrProp(O, 'Caption',S);
> > Except
> > end;
> > end;
>
----- Original Message -----
From: "Petr Vones" <pvones@mbox.vol.cz>
> Toto je ukazkovy priklad zcela nevhodneho pouziti vyjimek. Vyjimka je neco
> vyjimecneho, co by nemelo za beznych podminek vzniknout. V tomto pripade
je
> vsak pouzita jako nedilna soucast logiky te procedury. (nemluve o
predavani
> promenne typu string ktera by mela byt const S: string)
Jasne ze to je nekorektne ale tymto som chcel ukazat moznost pouzit unit
TypInfo. Ked by sa tazatel pozrel na funkcie tak tam je mozne taketo nieco
vyriesit uplne bez problemu a korektne.
Ty si to napisal presne :
PropInfo := GetPropInfo(Control, 'Caption', [tkLString]);
Result := PropInfo <> nil;
if Result then
SetStrProp(Control, PropInfo, Caption);
Ja som ale chcel aby tazatel trochu studoval... . Chcel som ho len
"nakopnut".
Lauko.
Odpovedá: Erik Salaj
5. 9. 2002 23:18
> Mozna, ale pouzivat misto jedne konstrukce if ... then try..raise..except
neni
> prilis pohodlne a navic v tom puvodnim prikladu to melo jeste dalsi chybu
a
> to, ze se takto 'neosetrovala' pouze predpokladana vyjimka, ale vsechny
dalsi
> ktere mohly indikovat jinou dalsi (tentokrate skutecne nepredpokladanou)
> chybu.
>
> Timto 'modernim' stylem by jsme se vlastne mohli dostat i ke konstrukcim
jako
> (pripad kdy instance objektu nemusi existovat):
Try/finally/except nie je vlastne nic ine, len vylepsene "goto". Ma svoje
opodstatnenie ak nie je nic lepsie k dispozicii, ale netreba to prehanat.
Rozhodne if prikaz je "normalnejsi" na riadenie programu ako
generovanie a odchytavanie vynimiek.
Erik
Odpovedá: Jiri Foldyna
5. 9. 2002 11:14
> > No jo, jenze to je dnes modni a dokonce to ma svuj terminus
> technicus -
> > ofenzivni programovaci styl . Nediv se, je to
> pohodlnejsi, mene
> > narocne na hlavu a zejmena to zapada do komercniho modelu
> prodeje SW. Proc
>
> Mozna, ale pouzivat misto jedne konstrukce if ... then
> try..raise..except neni
> prilis pohodlne a navic v tom puvodnim prikladu to melo jeste
> dalsi chybu a
> to, ze se takto 'neosetrovala' pouze predpokladana vyjimka,
> ale vsechny dalsi
> ktere mohly indikovat jinou dalsi (tentokrate skutecne
> nepredpokladanou)
> chybu.
Ahoj,
minil jsem to spis jako pokus o trpky zert. Muj nazor na vec se shoduje s
Tvym, tj. pouziti exception by se nemelo systematicky pouzivat jako
zkratkove osetreni vsech chyb (tedy i chyb v analyze . Za prve je to
nejspis neefektivni, za druhe to muze zakryvat chyby v algoritmech, za
jejichz odhalovani se pak krvave plati (mysleno pouze zcasti obrazne v
rutinnim nasazeni.
> Jinak receno, pouziva-li se nekde konstrukce try..except je
> nutne dobre zvazit
> jeji oduvodnenost a mozne dusledky.
Naprosty souhlas.
Zdravim
Jiri Foldyna
mailto:jiri.f@avizo.cz
>
> Petr Vones
Odpovedá: Jakub Dusek
3. 9. 2002 12:13
Bohuzel TControl ma Caption v private, je potreba to tedy udelat jeste
pres jednoho potomka a vytahnout to do public:
type
TCaptionControl = class (TControl)
public
property Caption;
end;
...
begin
for i := 0 to Form1.ComponentCount - 1 do
begin
Obj := Form1.Components [i];
if Obj is TControl then
TCaptionControl (Obj).Caption := 'x';
end;
end;
Jakub Dusek
-------------------------------------------
Homepage : http://dusek.zde.cz
Phone : +420604615795
Sms email : jakub.dusek@click.cz
ICQ: 86063232
Apps : Add/Remove Manager, Charmaper,
Sms GateKeeper
-------------------------------------------
Tuesday, September 3, 2002, 12:25:15 PM, you wrote:
iJF> Jde to castecne vyresit, pokud pouzijes spolecneho predka, ktery je v
iJF> hierarchii nejvys a pritom ma jeste potrebne vlastnosti.
iJF> V tomto pripade je to TControl.
iJF> Takze by to mohlo vypadat takto:
iJF> For i:=0 to Form1.ComponentCount-1 Do Begin
iJF> obj := Form1.Components[i];
iJF> If obj is TControl Then TControl(obj).Caption := 'x';
iJF> ........
iJF> End;
iJF> Stale se nevyhnes deleni, ale zmensis pocet techto deleni.